import plotly.graph_objects as go
import numpy as np

# 生成 x1 和 x2 的数据点
x1 = np.linspace(-10, 10, 100)  # 生成从 -10 到 10 的 100 个等间距点，作为 x1 的数据
x2 = np.linspace(-10, 10, 100)  # 生成从 -10 到 10 的 100 个等间距点，作为 x2 的数据

# 创建 x1 和 x2 的二维网格
x1, x2 = np.meshgrid(x1, x2)  # 使用 meshgrid 函数将 x1 和 x2 转换为二维网格

# 计算 y 值
y = 0.1 * x1 + 0.3 * x2  # 根据方程 y = 0.1 * x1 + 0.3 * x2 计算 y 值

# 创建 Plotly 图形对象
fig = go.Figure(data=[go.Surface(z=y, x=x1.flatten(), y=x2.flatten())])  # 创建一个三维表面图，z 轴为 y，x 轴为 x1，y 轴为 x2

# 生成随机散点数据
np.random.seed(42)  # 设置随机种子
random_x1 = np.random.uniform(-10, 10, 50)  # 生成 50 个随机 x1 值
random_x2 = np.random.uniform(-10, 10, 50)  # 生成 50 个随机 x2 值
random_y = 0.1 * random_x1 + 0.3 * random_x2  # 根据方程计算对应的 y 值

# 将随机散点添加到图形中
fig.add_trace(go.Scatter3d(x=random_x1, y=random_x2, z=random_y, mode='markers', name='随机散点'))

# 更新图形布局
fig.update_layout(
    title='3D Surface with Random Points',  # 设置图形标题
    autosize=False,  # 关闭自动调整大小
    width=700,  # 设置图形宽度为 700 像素
    height=700,  # 设置图形高度为 700 像素
    margin=dict(l=65, r=50, b=65, t=90),  # 设置图形的边距
    scene=dict(
        xaxis_title='X1',  # 设置 x 轴标题
        yaxis_title='X2',  # 设置 y 轴标题
        zaxis_title='Y'  # 设置 z 轴标题
    )
)

# 显示图形
fig.show()  # 显示图形